A typical computer system includes a processor, a memory controller, and main memory, among other things. The processor interacts with the memory controller, which controls the writing and reading of data to and from the main memory. In some systems, main memory includes multiple memory modules, each of which can include multiple storage devices (e.g., random access memory (RAM) chips).
During initial boot-up of a computer, the main memory is subjected to an initialization procedure. Using prior systems and methods, memory initialization is a processor-based operation, in which the processor runs a routine to attempt to fill each address location with predetermined, initialization data. To accomplish this task, the processor sequentially issues write commands to each memory address. The memory locations are filled linearly, beginning with the lowest physical address, and progressing through memory until attempts to initialize all of the memory locations have been made. Thus, the processor first issues commands directed toward locations associated with a first memory module, and when initialization of that memory module is completed, the processor issues commands directed toward locations associated with a second memory module, and so on.
In the past, after the memory initialization process was performed, a memory test also was performed. During the memory test, the processor would read from each memory location that it had attempted to initialize, to determine whether the predetermined initialization data existed at each location. If a read from a specific location produced data other than the predetermined data, an error was declared.
Memory initialization is a time-consuming task, particularly for systems that include large memory subsystems. For example, it is not unheard of for an initialization procedure to take minutes to perform. Market forces continually apply pressure to reduce boot-up times for various reasons. Accordingly, many systems have abandoned the memory test phase, in order to reduce the overall boot-up time. The elimination of the test phase has had a negative impact on system reliability.
Significantly reduced initialization times are difficult to achieve, in part because of the ever-increasing size of memory subsystems, and in part because of increased reliability expectations. Accordingly, what are needed are methods and apparatus that enable the initialization time of a memory subsystem to be significantly reduced. In addition, what are needed are methods and apparatus that increase the efficiency of memory initialization processes to a degree that memory tests may again be included within a boot-up procedure.